#include<iostream>
#include<vector>
#include <unistd.h>//sleep的头文件
#include <string.h>//strerror头文件
#include<sys/wait.h>
#include<sys/types.h>

std::vector<int>data;
pid_t ID =getpid();

enum 
{
    OK = 0,
    FORK_ERROR ,
    OPEN_FILE_ERROR,
};

int SaveBegin()
{
    //我们创建一个name变量，负责控制我们生成文件的名字
    //通过time函数获取时间戳
    std::string name= std::to_string(time(nullptr));

    //.backup是个文件后缀，通常代表这个文件是一个备份的文件。
    name+=".backup";

    //我们要将data中的数据备份到文件中
    //当不存在该名称的文件时，以写方式打开的fopen会自动创建该名称文件
    FILE*fp=fopen(name.c_str(),"w");
    if(fp==nullptr)
    {
        printf("open file error:%s\n",strerror(errno));
        return OPEN_FILE_ERROR;
    }

    //我们通过datastr来备份data中的数据
    //它会在for循环中不断追加数据
    std::string datastr;

    for(auto d:data)
    {
        datastr+=std::to_string(d);
        datastr+=" ";
    }
    //使用fputs将datastr写入文件中。
    fputs(datastr.c_str(),fp);
    fclose(fp);
    return OK;
}

void Save()
{
    pid_t id= fork();
    if(id<0)
    {
        printf("fork error:%s\n",strerror(errno));
        exit(FORK_ERROR);
    }

    //子进程代码块
    if(id==0)
    {
        //记录子进程的PID
        ID=getpid();
        int ret=SaveBegin();
        exit(ret);
    }

}
int main()
{
    int cnt=1;
    //标记是否需要等待子进程
    bool flag=false;
    do
    {
        data.push_back(cnt++);
        sleep(1);
        if(cnt % 10 == 0)
        {
            Save(); 
            flag=true;
        }
        if(flag)
        {
            int ret=waitpid(ID,nullptr,WNOHANG);
            if(ret>0)
            {
                //等待子进程成功，不再需要等待子进程
                flag=false;
            }
        }
    }while(1);
    return 0;
}